package com.niit.users.dao.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import com.niit.common.dao.impl.BaseDaoImpl;
import com.niit.common.util.ConstatFinalUtil;
import com.niit.common.util.PageInfoUtil;
import com.niit.users.dao.ITbOrderDao;
import com.niit.users.pojo.TbOrder;

import lombok.extern.log4j.Log4j2;

/**
 * 管理员表操作的Dao实现类
 * <p>
 * 已经确定此处子类使用的是肯定是Admins
 *
 * @author wangshMac
 */
@Log4j2
public class TbOrderDaoImpl extends BaseDaoImpl<TbOrder> implements ITbOrderDao {
    private String tableName = "tborder";
    private TbOrder pojo = new TbOrder();

    @Override
    public int saveOne(TbOrder pojo) {
        /*------只关心SQL语句和条件-------*/
        /* 条件 */
        List<Object> paramsList = new ArrayList<Object>();
        /* sql语句 */
        StringBuffer sqlSb = new StringBuffer();
        sqlSb.append("insert into " + tableName);
        sqlSb.append(" (orderStatus,orderCreationTime,busId,passengerId,timetableId,rideDate,seatNo) ");
        sqlSb.append(" values ");
        sqlSb.append(" (?,?,?,?,?,?,?) ");
        /* 为?赋值 */
        paramsList.add(pojo.getOrderStatus());
        paramsList.add(pojo.getOrderCreationTime());
        paramsList.add(pojo.getBusId());
        paramsList.add(pojo.getPassengerId());
        paramsList.add(pojo.getTimetableId());
        paramsList.add(pojo.getRideDate());
        paramsList.add(pojo.getSeatNo());

        /* 打印调试信息 */
        ConstatFinalUtil.SYS_LOGGER.info("sql语句:{}", sqlSb.toString());
        ConstatFinalUtil.SYS_LOGGER.info("sql条件:{}", paramsList);
        /* 执行sql语句 */
        int res = this.executeSqlUpdate(sqlSb.toString(), paramsList);
        /*
         * 主键才会放到List中 如何取到List中最后一个元素
         */
        pojo.setOrderId((int) paramsList.get(paramsList.size() - 1));
        return res;
    }

    /**
     * SQL语句和JDBC分离
     *
     * @param pojo
     * @return
     */
    @Override
    public int updateOne(TbOrder pojo) {
        /*------只关心SQL语句和条件-------*/
        /* 条件 */
        List<Object> paramsList = new ArrayList<Object>();
        /* sql语句 */
        StringBuffer sqlSb = new StringBuffer();
        sqlSb.append("update " + tableName + " set ");
        sqlSb.append(" orderStatus=?,orderCreationTime=?,busId=?,passengerId=?,timetableId=?,rideDate=?,seatNo=?");
        sqlSb.append(" where orderId = ?");
        /* 为?赋值 */
        paramsList.add(pojo.getOrderStatus());
        paramsList.add(pojo.getOrderCreationTime());
        paramsList.add(pojo.getBusId());
        paramsList.add(pojo.getPassengerId());
        paramsList.add(pojo.getTimetableId());
        paramsList.add(pojo.getRideDate());
        paramsList.add(pojo.getSeatNo());
        paramsList.add(pojo.getOrderId());
        /* 打印调试信息 */
        ConstatFinalUtil.SYS_LOGGER.info("sql语句:{}", sqlSb.toString());
        ConstatFinalUtil.SYS_LOGGER.info("sql条件:{}", paramsList);
        /* 执行sql语句 */
        return this.executeSqlUpdate(sqlSb.toString(), paramsList);
    }

    @Override
    public int deleteOne(Map<String, Object> condMap) {
        /*------只关心SQL语句和条件-------*/
        /* sql语句 */
        StringBuffer sqlSb = new StringBuffer();
        /* 条件 */
        List<Object> paramsList = new ArrayList<Object>();
        sqlSb.append("delete from " + tableName);
        if (condMap.get("id") != null && !"".equalsIgnoreCase(condMap.get("id") + "")) {
            /* 根据id作为条件 */
            sqlSb.append(" where orderId = ? ");
            paramsList.add(condMap.get("id"));
        }
        /* 打印调试信息 */
        ConstatFinalUtil.SYS_LOGGER.info("sql语句:{}", sqlSb.toString());
        ConstatFinalUtil.SYS_LOGGER.info("sql条件:{}", paramsList);
        return this.executeSqlUpdate(sqlSb.toString(), paramsList);
    }

    @Override
    public TbOrder findOne(Map<String, Object> condMap) {
        /*-----------拼装SQL语句和条件----------*/
        /*
         * 存储条件 condMap:用户输入的搜索条件 paramsList:存储的是SQL语句的条件
         */
        List<Object> paramsList = new ArrayList<Object>();
        /*
         * SQL语句和条件 ?的位置和List的顺序一定要一致
         */
        StringBuffer sqlSb = new StringBuffer();
        sqlSb.append("select * from " + tableName + " where 1 = 1 ");
        /* 根据id查询 */
        if (condMap.get("id") != null && !"".equalsIgnoreCase(condMap.get("id") + "")) {
            /* 根据id作为条件 */
            sqlSb.append(" and orderId = ? ");
            paramsList.add(condMap.get("id"));
        } else if (condMap.get("email") != null && !"".equalsIgnoreCase(condMap.get("email") + "")) {
            /* 根据邮箱查询(其它条件--名字) */
            sqlSb.append(" and email = ? ");
            paramsList.add(condMap.get("email"));
        }
        ConstatFinalUtil.SYS_LOGGER.info("sql语句:{}", sqlSb.toString());
        ConstatFinalUtil.SYS_LOGGER.info("sql条件:{}", paramsList);

        return this.findOneBase(sqlSb.toString(), paramsList, new TbOrder());
    }

    /**
     * 分页+搜索+列表
     */
    @Override
    public List<TbOrder> findCondList(PageInfoUtil pageInfoUtil, Map<String, Object> condMap) {
        /*-----------拼装SQL语句和条件----------*/
        /*
         * 存储条件 condMap:用户输入的搜索条件 paramsList:存储的是SQL语句的条件
         */
        List<Object> paramsList = new ArrayList<Object>();
        /*
         * SQL语句和条件 ?的位置和List的顺序一定要一致
         */
        StringBuffer sqlSb = new StringBuffer();
        sqlSb.append("select * from " + tableName + " where 1 = 1 ");
        /* 关键字 */
        if (condMap.get("keyword") != null && !"".equalsIgnoreCase(condMap.get("keyword") + "")) {
            sqlSb.append(" and (email like ? or phone like ? or name like ?) ");
            /* 有几个?就放几个条件 */
            paramsList.add("%" + condMap.get("keyword") + "%");
            paramsList.add("%" + condMap.get("keyword") + "%");
            paramsList.add("%" + condMap.get("keyword") + "%");
        }

        /* 状态 */
        if (condMap.get("passengerId") != null && !"".equalsIgnoreCase(condMap.get("passengerId") + "")) {
            sqlSb.append(" and passengerId = ? ");
            paramsList.add(condMap.get("passengerId"));
        }

        /*
         * 时间范围 从map中取的值是Object,想判断一下,是不是Date对象 怎么判断A是不是B的一个对象呢(A是对象,B是类)
         */
        if (condMap.get("stTime") instanceof Date && condMap.get("edTime") instanceof Date) {
            sqlSb.append(" and createTime > ? and createTime < ? ");
            paramsList.add(condMap.get("stTime"));
            paramsList.add(condMap.get("edTime"));
        }

        /* 默认都有orderby */
        if ("iddesc".equalsIgnoreCase(condMap.get("orderby") + "")) {
            sqlSb.append(" order by orderId desc ");
        } else if ("idasc".equalsIgnoreCase(condMap.get("orderby") + "")) {
            sqlSb.append(" order by orderId asc ");
        } else {
            sqlSb.append(" order by orderId desc ");
        }
        ConstatFinalUtil.SYS_LOGGER.info("sql语句:{}", sqlSb.toString());
        ConstatFinalUtil.SYS_LOGGER.info("sql条件:{}", paramsList);
        /*
         * ~分页查询 ~不分页查询 ~搜索查询
         */
        if (pageInfoUtil != null) {
            /* 分页查询 */
            return this.findByPage(pageInfoUtil, sqlSb.toString(), paramsList, pojo);
        }
        /* 不分页查询 */
        return this.find(sqlSb.toString(), paramsList, pojo);
    }

}
